/*
 * 最大乘积
 *
 * 题目链接：https://programming.pku.edu.cn/probset/c4b75386cfd8411991908475c4b91bc6/ef6b04b013a041418460f2df14868288/
 * 作者：lyazj <seeson@pku.edu.cn>
 *
 * 本题所需主要知识点：
 *   - 记忆化搜索或动态规划
 *
 * 此处为基于 used 数组去重的方案
 */

#include <stdbool.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
  int n;
  scanf("%d", &n);

  double dp[n + 1];         // 最大乘积
  int last[n + 1];          // 最近选中的因子
  bool used[n + 1][n + 1];  // [i] -> dp[i] 已经使用过的因子标记为 true
  memset(used, 0, sizeof used);

  for(int i = 1; i <= n; ++i) {
    // 初始化为“不拆分”情形
    dp[i] = i;
    last[i] = i;
    used[i][i] = true;

    // 枚举所有拆分方案
    for(int j = 2; j < i - 1; ++j) {
      if(used[j][i - j]) continue;                 // 去重
      if(dp[j] * (i - j) > dp[i]) {                // 找到更优方案
        dp[i] = dp[j] * (i - j);                   // 更新最大乘积
        last[i] = j;                               // 更新最近选中的因子
        memcpy(used[i], used[j], sizeof used[i]);  // 更新 dp[i] 使用的因子
        used[i][i - j] = true;
      }
    }
  }

  // 提取最优解使用的所有因子
  int ans[n + 1];
  memset(ans, 0, sizeof ans);
  int i = n;
  for(;;) {
    if(last[i] == i) {
      ++ans[i];  // 计数排序
      break;
    }
    ++ans[i - last[i]];
    i = last[i];
  }
  for(i = 1; i <= n; ++i) {
    if(ans[i]) printf("%d ", i);
  }
  fseek(stdout, -1, SEEK_CUR);
  printf("\n");
  return 0;
}
